package com.tedu.api.list;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**Collection集合下 子集合【叫队列】 包位置：java.util
 * Queue  队列  单端队列
 * Deque  队列  双端队列  "Deque接口---继承--Queue接口"
 * 作用：保存数据，有序储存和处理，功能：数据缓冲或者多线程协调工作！
 *
 */
public class QueueAPI {
    //Queue  队列    单端队列
    @Test
    public void testQueue(){
        //创建队列---多态--LinkedList
        Queue<String> queue=new LinkedList<>();
        /**
         * offer() ----add()  一样
         * 作用：  入队操作，队尾追加元素
         */
        queue.offer("玛卡巴卡");
        queue.offer("依古比古");
        queue.offer("小点点");
        queue.offer("飞飞🐟");
        System.out.println("Queue队列："+queue);
        /**
         * poll()
         * 作用：  出队操作，获取队首元素，并且删除队列中队首
         * peek()
         * 作用：  出队操作，获取队首元素，不删除队列中队首
         */
        queue.poll(); //删除队首元素
        System.out.println("Queue队列："+queue);
        String str=queue.peek();
        System.out.println("队首元素:"+str);
        System.out.println("Queue队列："+queue);
        /**
         * 需求：1.遍历队列---while---只遍历一次队列【队列元素消失】
         *     提示：while 条件 ：拿到队列中总长度 size()>0
         * 需求：2.遍历队列---增强for---队列元素不消失
         *     提示： for  条件：E e：队列
         */
        //while (queue.size()>0){//true：队列总数>0 队列有元素 遍历
//     str=queue.poll();//获取队首、删除队列中队首
//    System.out.println("获取队列元素："+str);
        /**
         * 需求：2.遍历队列---增强for---队列元素不消失
         *    提示： for  条件：E e 数组泛型/集合泛型：数组引用/集合引用
         */
        for(String e:queue){
            System.out.println("队列元素："+e);
        }
        System.out.println("Queue队列元素"+queue);
    }
    //Deque 队列   双端队列---继承---单端队列
    @Test
    public void testDeque(){
        //创建Deque 双端队列  方法基本一致，部分方法一致
        Deque<String> deque=new LinkedList<>();
        deque.offer("玛卡巴卡");
        deque.offer("依古比古");
        deque.offer("小点点");
        deque.offer("飞飞🐟");
        System.out.println("双端队列："+deque);
        //offerFirst()   队首添加元素  offerLast()  队尾添加元素
        deque.offerFirst("叮叮车");
        deque.offerLast("哈呼呼");
        System.out.println("双端队列[首尾添加元素]："+deque);
        //getFirst() 获取队首  getLast()  获取队尾
        System.out.println("获取队列中队首："+deque.getFirst());
        System.out.println("获取队列中队尾："+deque.getLast());
        //pollFirst() 获取队首，删除队列中队首 【单端：poll类似】
        //pollLast()  获取队尾，删除队列中队尾
        String yi=deque.pollLast();//删依古比古元素 队列--队首
        System.out.println("队尾元素："+yi);
        System.out.println("队列元素："+deque);

    }
    @Test
    public void testStack(){
        //创建双端队列---支持栈结构
        Deque<String> stack=new LinkedList<>();
        /**
         * push()  Deque 独有的方法--支持栈结构
         * ----offer:Queue----add：Collection接口 【添加】
         * 作用：【添加：往栈压入一个元素】 压栈操作
         */
        stack.push("玛卡巴卡");
        stack.push("依古比古");
        stack.push("小点点");
        stack.push("飞飞🐟");
        System.out.println("栈结构："+stack);
        /**
         * pop() 出一个栈元素 ---polllast类似【拿先入后出，拿到一个压栈元素】
         */
        String last=stack.pop();
        System.out.println("出栈尾元素："+last);
        System.out.println("栈结构："+stack);
        //面试题： pop poll peek的使用区别？
        /**
         * 需求1：遍历栈结构---while---元素出栈，队列元素需要清空
         * 需求2：遍历栈结构---增强for--元素遍历成功，队列元素不变
         */
        for(String x:stack){
            System.out.println(x);
        }
        System.out.println(stack);
        while(stack.size()>0){
            String y=stack.pop();
            System.out.println("出栈："+y);
        }






    }
}
